/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package actioncombination.logic.environment;

import actioncombination.common.value.DoubleValue;
import actioncombination.logic.agent.action.Action;
import actioncombination.logic.agent.Agent;
import actioncombination.logic.agent.AgentState;
import actioncombination.logic.agent.Perception;
import actioncombination.problem.gridworld.AgentStateImpl;
import actioncombination.problem.gridworld.PerceptionImpl;
import actioncombination.logic.agent.RLAgent;
import java.util.Collection;
import java.util.Map;


/**
 *
 * @author Administrador
 */
public abstract class RLEnvironment extends Environment {

    private RLAgent agentRL;

    protected RLEnvironment(RLEnvironmentState state) {
        // Se instancia el estado del ambiente.-
        this.environmentState = state;
    }

    public Perception getPercept(Agent agent) {
        // El ambiente crea una percepción que va a ser recibida por el Agente.- 
        PerceptionImpl p = new PerceptionImpl();

        // Es necesario realizar un "cast" para acceder a los métodos del agente Agente.- 
        setAgentRL((RLAgent) agent);
         
        // Asigna las percepciones en los sensores.-
        p.initPerception(agent,this);
       
        // Retorna la nueva percepción creada.-
        return p;
    }
    
    public abstract Collection<AgentState> getNextPosiblesActionsStates(RLAgent agent);

    public int getHere(int fil, int col) {
        return ((RLEnvironmentState) this.environmentState).getHere(fil, col);
    }

    @Override
    public String toString() {

        return environmentState.toString();
    }

    public RLAgent getAgentRL() {
        return agentRL;
    }

    public void setAgentRL(RLAgent agentRL) {
        this.agentRL = agentRL;
    }
    
    public abstract DoubleValue getReward(Agent agent);
    
    protected abstract void createEnvironment();
}
